package Graficas;

/**
 * Clase que almacena todos los sprites correspondientes a un objeto. Controla que los sprites se
 * pinten en el orden correcto de acuerdo al movimiento que este realizando, aplicando un retardo
 * entre cada transicion de sprites. Esta clase contiene un arreglo de Sprites, el cual esta
 * dividido de la siguiente manera:
 * 
 * [s0_0, s0_1, ... ,s0_n, s1_0, s1_1, ... ,s1_n,..., sk_0, sk_1, ... , sk_n]
 * 
 * donde k es la cantidad de direcciones que posee el SpriteMovement, y n es la cantidad de sprites
 * se que almacenan por cada direccion k.
 * 
 * 
 * @author Mariano Rodecker
 * @author Matias Varela
 * 
 */
public class SpriteMovements {
	/* ################## ATRIBUTOS DE INSTANCIA ######################## */
	protected Sprite[] sprites;
	protected int imgActual, cantSpritesDir, cantDir;
	protected int retardo, maxRetardo;

	/* ################## CONSTRUCTORES ######################## */
	/**
	 * Constructor para un SpriteMovement.
	 * 
	 * @param sprites
	 *            - Arreglo con todos los sprites.
	 * @param cantSpritesDir
	 *            - Es la cantidad de sprites que se almacenan por cada direccion.
	 * @param cantDir
	 *            - es la cantidad de direcciones que posee el SpriteMovement
	 * @param maxRetardo
	 *            - es la cantidad de retardo entre cada transicion de sprites.
	 */
	public SpriteMovements(Sprite[] sprites, int cantSpritesDir, int cantDir, int maxRetardo) {
		this.sprites = sprites;
		imgActual = 0;
		this.cantSpritesDir = cantSpritesDir;
		this.cantDir = cantDir;
		retardo = maxRetardo;
		this.maxRetardo = maxRetardo;
	}

	/* ################## CONSULTAS ######################## */

	/**
	 * Obtiene el sprite adecuado segun la direccion pasada por parametro, aplicando el retardo
	 * adecuado.
	 * 
	 * @param mov
	 *            - es la direccion en la cual se quiere realizar transiciones de sprites
	 * @return - el sprite correspondiente a la transicion.
	 */
	public Sprite getSprite(int mov) {
		if (retardo > 0)
			retardo--;
		else {
			imgActual = ((imgActual + 1) % cantSpritesDir) + mov * cantSpritesDir;
			retardo = maxRetardo;
		}
		return sprites[imgActual];
	}
	
	public SpriteMovements clone(){
		Sprite[] spritesClone= new Sprite[sprites.length];
		for (int i=0;i<sprites.length;i++){
			spritesClone[i]=sprites[i];
		}
		return new SpriteMovements(spritesClone,this.cantSpritesDir,this.cantDir,this.maxRetardo);
	}

}
